//
//  YDGCDThread.h
//  YDBASE
//
//  Created by rowena on 2019/5/8.
//  Copyright © 2019 wuyezhiguhun. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

/**
 * GCD线程队列类型
 */
typedef NS_ENUM(NSInteger, YDQueueType) {
    /** 串行队列 */
    YDQueueTypeSerial       = 0,
    /** 并行队列 */
    YDQueueTypeParallel     = 1,
};

@interface YDGCDThread : NSObject

/** 创建单例 */
+ (instancetype)sharedThread;

/**
 * 加锁
 */
- (void)yd_Lock;

/**
 * 解锁
 */
- (void)yd_Unlock;

/**
 * 添加加锁模块
 * @pram block 加锁内的代码块
 */
+ (void)yd_LockBack:(nullable void (^)(void))block;

/**
 * 添加加锁模块
 * @pram block 加锁内的代码块
 */
- (void)yd_LockBack:(nullable void (^)(void))block;

/**
 * 创建队列
 * @pram label 字符指针
 * @pram queue 队列类型
 * @return 返回队列
 */
+ (dispatch_queue_t)yd_QueueCreate:(char *)label queue:(YDQueueType)queue;

/**
 * 创建队列
 * @pram label 字符指针
 * @pram queue 队列类型
 * @return 返回队列
 */
- (dispatch_queue_t)yd_QueueCreate:(char *)label queue:(YDQueueType)queue;

/**
 * 同步执行 主线程 类方法
 * @pram queue 队列
 * @pram back 回调
 */
+ (void)yd_SyncQueue:(dispatch_queue_t)queue back:(dispatch_block_t)back;

/**
 * 异步执行 主线程 类方法
 * @pram back 回调
 */
+ (void)yd_AsyncMainQueueBack:(dispatch_block_t)back;

/**
 * 异步执行 自定义线程 类方法
 * @pram queue 队列
 * @pram back 回调
 */
+ (void)yd_AsyncQueue:(dispatch_queue_t)queue back:(dispatch_block_t)back;

/**
 * 同步执行 自定义线程 对象方法
 * @pram queue 队列
 * @pram back 回调
 */
- (void)yd_SyncQueue:(dispatch_queue_t)queue back:(dispatch_block_t)back;

/**
 * 异步执行 主线程 对象方法
 * @pram back 回调
 */
- (void)yd_AsyncMainQueueBack:(dispatch_block_t)back;

/**
 * 异步执行 自定义线程 对象方法
 * @pram queue 队列
 * @pram back 回调
 */
- (void)yd_AsyncQueue:(dispatch_queue_t)queue back:(dispatch_block_t)back;

/**
 * 同步执行 串行 对象方法
 * @pram back 回调
 */
- (void)yd_SyncSerialQueueBack:(dispatch_block_t)back;
/**
 * 异步执行 串行 对象方法
 * @pram back 回调
 */
- (void)yd_AsyncSerialQueueBack:(dispatch_block_t)back;


/**
 * 同步执行 并行 对象方法
 * @pram back 回调
 */
- (void)yd_SyncConcurrentQueueBack:(dispatch_block_t)back;

/**
 * 异步执行 并行 对象方法
 * @pram back 回调
 */
- (void)yd_AsyncConcurrentQueueBack:(dispatch_block_t)back;

/**
 * 延迟 类方法
 * @pram time 延迟时间
 * @pram back 延迟结束后回调
 */
+ (void)yd_DelayTime:(CGFloat)time back:(dispatch_block_t)back;

/**
 * 延迟 对象方法
 * @pram time 延迟时间
 * @pram back 延迟结束后回调
 */
- (void)yd_DelayTime:(CGFloat)time back:(dispatch_block_t)back;

/**
 * 只执行一次 对象方法
 * @pram back 回调
 */
+ (void)yd_OnceBack:(dispatch_block_t)back;

/**
 * 只执行一次 对象方法
 * @pram back 回调
 */
- (void)yd_OnceBack:(dispatch_block_t)back;


@end

NS_ASSUME_NONNULL_END
